package handlers

import (
	"net/http"
	"qimo_work/models"
	"qimo_work/services"

	"github.com/gin-contrib/sessions"

	"github.com/gin-gonic/gin"
)

// Register 用户注册
func Register(c *gin.Context) {
	var user models.User

	// 绑定请求体
	if err := c.ShouldBindJSON(&user); err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}

	// 调用 auth.service 注册功能
	if err := services.RegisterUser(&user); err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}

	// 返回成功信息
	c.JSON(http.StatusOK, gin.H{"message": "User registered successfully"})
}

// Login 登录处理package handlers

// CheckAuth 检查用户认证状态
func CheckAuth(c *gin.Context) {
	session := sessions.Default(c)
	userID := session.Get("userID")
	role := session.Get("role")

	if userID == nil {
		c.JSON(http.StatusOK, gin.H{
			"isAuthenticated": false,
		})
		return
	}

	c.JSON(http.StatusOK, gin.H{
		"isAuthenticated": true,
		"role":            role,
		"userInfo": gin.H{
			"username": userID,
		},
	})
}

// Logout 处理用户登出
func Logout(c *gin.Context) {
	session := sessions.Default(c)

	// 清除session
	session.Clear()
	err := session.Save()
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{
			"error": "Failed to clear session",
		})
		return
	}

	// 清除cookie
	c.SetCookie(
		"token", // cookie名称
		"",      // cookie值（空值）
		-1,      // 最大存活时间（负数表示立即删除）
		"/",     // 路径
		"",      // 域名
		false,   // 是否只能通过HTTPS访问
		true,    // 是否禁止JS访问
	)

	c.JSON(http.StatusOK, gin.H{
		"message": "Successfully logged out",
	})
}

// 修改现有的 Login 函数，添加 session 和 cookie 支持
func Login(c *gin.Context) {
	var loginReq struct {
		Username  string `json:"username" binding:"required"`
		Password  string `json:"password" binding:"required"`
		KeepLogin bool   `json:"keepLogin"` // 新增：是否保持登录
	}

	if err := c.ShouldBindJSON(&loginReq); err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid request data"})
		return
	}

	// 调用服务层登录功能
	token, role, err := services.LoginUser(loginReq.Username, loginReq.Password)
	if err != nil {
		c.JSON(http.StatusUnauthorized, gin.H{"error": err.Error()})
		return
	}

	// 设置 session
	session := sessions.Default(c)
	session.Set("userID", loginReq.Username)
	session.Set("role", role)
	err = session.Save()
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to save session"})
		return
	}

	// 如果选择了保持登录，设置 cookie
	if loginReq.KeepLogin {
		c.SetCookie(
			"token",
			token,
			7*24*60*60, // 7天
			"/",
			"",
			false,
			true,
		)
	}

	c.JSON(http.StatusOK, gin.H{
		"message": "Login successful",
		"token":   token,
		"role":    role,
	})
}
